import axios from 'axios'
import {Message} from 'element-ui'
import store from '@/store'
import {getToken} from '@/utils/auth'
import XEUtils from 'xe-utils'
// 错误码 errorCode 多语言以en为标准
import errorCode from '@/i18n/en/errorCode';
// 语言包
import i18n from '@/i18n'

/**
 * 提示函数
 * 禁止点击蒙层、显示一秒后关闭
 */
const tip = msg => {


  Message({
    message: msg || 'Error',
    type: 'error',
    duration: 1 * 1000
  })

}

/**
 * 跳转登录页
 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面
 */
const toLogin = () => {
  router.replace({
    path: '/login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  });
}

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
  // 状态码判断
  switch (status) {
    // 401: 未登录状态，跳转登录页
    case 401:
      toLogin();
      break;
    // 403 token过期
    // 清除token并跳转登录页
    case 403:
      tip('登录过期，请重新登录');
      // localStorage清除token
      localStorage.removeItem('token');
      // 状态管理初始化token
      store.dispatch('user/resetToken', false)
      setTimeout(() => {
        toLogin();
      }, 1000);
      break;
    // 404请求不存在
    case 404:
      tip('请求的资源不存在');
      break;
    default:
      console.log(other);
  }
}

// create an axios instance
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 * 1000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      // config.headers['X-Token'] = getToken()
      /* 请求header携带token */
      let token = store.getters.token || getToken();
      // console.log('token:',token);
      token && (config.headers.Authorization = token);

    }
    return config
  },
  error => {
    // do something with request error
    // console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
   */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    // http状态码为200
    if (response.status === 200) {
      const res = response.data

      if (res.err_code == '10008') {
        tip('登录过期，请重新登录');
        // localStorage清除token
        localStorage.removeItem('token');
        // 状态管理初始化token
        store.dispatch('user/resetToken', false)
        setTimeout(() => {
          toLogin();
        }, 1000);
      }

      const errorMsg = XEUtils.clone(errorCode, true)
      // 获取成功错误代码的key值（20000，20001...）
      const errorMsgSucceedKeys = []
      XEUtils.objectEach(errorMsg.succeed, (item, key) => {
        errorMsgSucceedKeys.push(key)
      })

      let emsg, etype;



      console.log('32223333',i18n.t(`errorCode.succeed.${res.err_code}.msg`));

      // 如果error_code 不是 20000  20001 20002 20004 ...，  it is judged as an error.
      if (XEUtils.arrayIndexOf(errorMsgSucceedKeys, res.err_code) === -1) {
        // 获取错误代码对象
        let errorMsgSucceedObj = errorMsg.failed[`${res.err_code}`]

        if (!XEUtils.isEmpty(errorMsgSucceedObj)) {
          // 获取错误代码对应报错信息
          emsg = i18n.t(`errorCode.failed.${res.err_code}.msg`)
          etype = i18n.t(`errorCode.failed.${res.err_code}.type`)
        } else {
          emsg = 'Error'
          etype = 'error'
        }

        Message({
          message: emsg,
          type: etype,
          duration: 1 * 1000
        })
        return Promise.reject({
          emsg,
          etype,
          err_code: res.err_code
        })
      } else {
        // 获取错误代码对象
        let errorMsgSucceedObj = errorMsg.succeed[`${res.err_code}`]
        // console.log('errorMsgSucceedObj',errorMsgSucceedObj);
        // 如果不是空对象和null 提示错误代码信息
        if (!XEUtils.isEmpty(errorMsgSucceedObj)) {
          // 获取错误代码对应报错信息
          emsg = i18n.t(`errorCode.succeed.${res.err_code}.msg`) || ''
          etype = i18n.t(`errorCode.succeed.${res.err_code}.type`) || ''


          console.log('33333',i18n.t(`errorCode.succeed.${res.err_code}.msg`));
          if (emsg !== '' && etype !== '') {
            Message({
              message: emsg,
              type: etype,
              duration: 1 * 1000
            })
          }
        }

        return res
      }


      // console.log('errorMsg:::',errorMsg);
      // console.log('errorMsgKey:::',errorMsgSucceedKeys);


      // // if the custom code is not 20000, it is judged as an error.
      // if (res.err_code !== '20000') {

      //   // 集中对错误码处理
      //   Message({
      //     message: res.msg || 'Error',
      //     type: 'error',
      //     duration: 5 * 1000
      //   })


      //   // 50008: 非法的 Illegal token; 50012: 其他客户端登录 Other clients logged in; 50014: 令牌过期 Token expired;
      //   // 如果以上状态码，询问是否刷新token
      //   // if (res.err_code === 50008 || res.err_code === 50012 || res.err_code === 50014) {
      //   //   // to re-login
      //   //   MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
      //   //     confirmButtonText: 'Re-Login',
      //   //     cancelButtonText: 'Cancel',
      //   //     type: 'warning'
      //   //   }).then(() => {
      //   //     store.dispatch('user/resetToken').then(() => {
      //   //       location.reload()
      //   //     })
      //   //   })
      //   // }
      //   // return false;
      //   return Promise.reject(new Error(res.msg || 'Error'))
      //   // Promise.reject(response)
      // } else {
      //   return res
      // }
    } else {
      // 不是正常状态码200
      Promise.reject(response)
    }

  },
  error => {

    const {response} = error;
    // 对非200的状态码处理
    if (response) {
      // 请求已发出，但是不在2xx的范围  暂时不考虑 200 以外状态码处理
      errorHandle(response.status, response.data.msg);
      return Promise.reject(new Error(response.data.msg || 'Error'))  //现在配合elementadmin返回的代码
      // return Promise.reject(response); //以前返回代码
    } else {
      // 处理断网的情况
      // eg:请求超时或断网时，更新state的network状态
      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
      // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
      Message({
        message: '网络中断',
        type: 'error',
        duration: 5 * 1000
      })
      store.dispatch('app/setNetwork', false)
    }
  }
)

export default service
